package br.com.conhecimento.core.util;



/**
 * @author Tiago Nogueira
 *
 */
public class CNPJCPFUtil {

	//Construtor privado. Os métodos devem ser estáticos
	private CNPJCPFUtil() {}

	/**
	 * Método para retirar qualquer caractere não numérico de uma String
	 *
	 * @param cpfCnpj
	 * @return
	 */
	public static final long retiraCaracteresAlpha(String cpfCnpj) {
		return Long.parseLong(cpfCnpj.replaceAll("\\D+", ""));
	}


	public static final String retiraCaracteresAlphaStr(String cpfCnpj) {
		if(cpfCnpj == null) return null;
		return cpfCnpj.replaceAll("\\D+", "");
	}

	public static void main(String[] args) {
		//System.out.println(retiraCaracteresAlpha("09.481.833/1000-18"));
		//System.out.println(validaCpf("64284776100"));
	}
	/**
	 * Realiza a formatação do CPF recebido
	 *
	 * @param cpf
	 * @return
	 */
	public static String formataCPF(long cpf) {
		return formataCPF(String.valueOf(cpf));
	}

	/**
	 * Realiza a formatação do CPF recebido
	 *
	 * @param cpf
	 * @return
	 */
	public static String formataCPF(String cpf) {
		// 32553804806
		// 325.538.048-06

		if (cpf == null) {
			return "";
		}

		cpf = String.valueOf(retiraCaracteresAlpha(cpf));
		cpf=colocaZeros(cpf,11);
		int leng = 0;

		String digito = "";
		String numero = "";
		String tmp = "";

		digito = cpf.substring(cpf.length() - 2);
		tmp = cpf.substring(0, cpf.length() - 2);
		while (tmp.length() > 0) {
			if ((tmp.length() - 3) > 0) {
				leng = tmp.length() - 3;
			} else {
				leng = tmp.length();
			}

			numero = tmp.substring(leng) + numero;
			tmp = tmp.substring(0, leng);

			if ((tmp.length() - 3) > 0) {
				numero = "." + numero;
			} else {
				numero = tmp + "." + numero;
				tmp = "";
			}
		}

		return numero + "-" + digito;
	}


	public static String colocaZeros(String cpf,int qtde) {
		if (cpf != null) {
			if(cpf.length() < qtde){
				int zero = qtde - cpf.length();
				String szero="";
				for(int i=1;i <=zero;i++){
					szero+="0";
				}
				return szero+cpf;
			}
		}
		return cpf;
	}

	/*
	 * realiza a formatação do valor de acordo com a mascara enviada
	 */
	public static String formatar( String valor, String mascara ) {

		String dado = "";
		// remove caracteres nao numericos
		for ( int i = 0; i < valor.length(); i++ )  {
			char c = valor.charAt(i);
			if ( Character.isDigit( c ) ) { dado += c; }
		}

		int indMascara = mascara.length();
		int indCampo = dado.length();

		for ( ; indCampo > 0 && indMascara > 0; ) {
			if ( mascara.charAt( --indMascara ) == '#' ) { indCampo--; }
		}

		String saida = "";
		for ( ; indMascara < mascara.length(); indMascara++ ) {
			saida += ( ( mascara.charAt( indMascara ) == '#' ) ? dado.charAt( indCampo++ ) : mascara.charAt( indMascara ) );
		}
		return saida;
	}

	public static String formatarCpf( String cpf ) {
		cpf=colocaZeros(cpf,11);

		return formatar( cpf, "###.###.###-##" );
	}

	public static String formatarCnpj( String cnpj ) {
		if(cnpj != null) {
			if(cnpj != null && cnpj.equals("")) return "";
			while( cnpj.length() < 14 ) {
				cnpj = "0" + cnpj;
			}
		} else {
			return "";
		}
		
		return formatar( cnpj,"##.###.###/####-##" );
	}

	public static String get3PrimeirosDigitosCPF(String nuLoginCpf) {
			nuLoginCpf = colocaZeros(nuLoginCpf, 11);
		if (nuLoginCpf != null) {
			return nuLoginCpf.substring(0, 3);
		}
		return nuLoginCpf;
	}
	public static String get6PrimeirosDigitosCPF(String nuLoginCpf) {
		nuLoginCpf = colocaZeros(nuLoginCpf, 11);
	if (nuLoginCpf != null) {
		return nuLoginCpf.substring(0, 6);
	}
	return nuLoginCpf;
}

}
